www.gusucode.com > LTE基带收发仿真系统matlab源码程序 > LTE baseband simulation/codeblock_segment.m

    function c = codeblock_segment(b,iUE,iTB)
% 功能:对已经添加CRC24A的数据b进行码块分割,并给分割后数据添加CRC24B
%      参照36.212 V870 5.1.2
% 输入:
%      b:完成CRC24校验的数据
%    iUE: 第i个用户
%    iTB:第i个TB
% 输出:
%      c:完成码块分割和CRC24B校验的数据
%  
%  Author:		程式小组(徐萌 张妙 张晓庆)
%  Date:		2010-06-20
%  ===========================================================
global LTE_par
load InLeaverPar % 载入Turbo编码内交织参数 inLeaverPar
nBlockSize = size(inLeaverPar,1); % 总共nBlockSize种码块分割长度
Z = 6144; % 最大码块大小

B = length(b);
if B <40
    F = 40-B;
    c0 = NaN*ones(1,F);
    c = [c0,b];
    C = 1;
    Ka = 40;
    Ca = 1;
    Kb = 0;
    Cb = 0;
else
    if B <= Z
        L = 0; % 不添加CRC24B校验位
        C = 1; % 不分割,码块长度为1
        Bz = B;
    else
        L = 24; % CRC校验长度
        C = ceil(B/(Z-L)); % 码块长度
        Bz = B+C*L;
    end
    % 寻找K,满足C*K>=B'
    for k = 1:nBlockSize
        if inLeaverPar(k,1)*C >= Bz
            Ka = inLeaverPar(k,1);      % 标准中的K+
            break;
        end
    end
    
    % 如果C=0,不进行分块
    if C == 1
        Ca = 1;
        Kb = 0;
        Cb = 0;
        % 否则进行分块处理
    elseif C>1
        Kb = inLeaverPar(k-1,1);
        deltaK = Ka-Kb;
        Cb = floor((C*Ka-Bz)/deltaK);
        Ca = C-Cb;
    end
    
    c = cell(C,1); % 根据分得的块数,建立存储分块后的存储空间
    
    % 计算填充比特大小,并对第一个块的前F个数据置空
    F = Ca*Ka+Cb*Kb-Bz;
    if F>0
        c0 = NaN*ones(1,F);
    end
    
    k = F+1;
    s = 1;
    for r = 1:C
        if r <= Cb
            Kr = Kb;
        else
            Kr = Ka;
        end
        c{r,1} = zeros(1,Kr);
        if(r == 1 && F>0)
            c{r,1}(1:F) = c0; % 存储填充比特
        end
        while(k <= Kr-L)
            c{r,1}(k) = b(s);
            k = k+1;
            s = s+1;
        end
        if C>1
            p = crc24b(c{r,1}(1:Kr-L));
            while(k<=Kr)
                c{r,1}(k) = p(k+L-Kr);
                k = k+1;
            end
        end
        k = 1;
    end
end

LTE_par.UE_par.nCB(iTB,iUE) = C; 
LTE_par.UE_par.Ka(iTB,iUE) = Ka;
LTE_par.UE_par.Ca(iTB,iUE) = Ca;
LTE_par.UE_par.Kb(iTB,iUE) = Kb;
LTE_par.UE_par.Cb(iTB,iUE) = Cb;

% % ======================= 测试用 验证分块正确性 =====================
% for r = 1:C
%     if r < Cb
%         Kr = Kb;
%     else
%         Kr = Ka;
%     end
%     tt1 = 1+(r-1)*(Kr-24);
%     tt2 = r*(Kr-24);
%     re = sum(abs(b(tt1:tt2)-c{r,1}(1:end-24)));
%     tt1 = tt1+24;
%     tt2 = tt2+24;
%     disp('re')
%     disp(re)
% end